#include "Vector4D.h"

Vector4D::Vector4D(void)
{
}

Vector4D::Vector4D(const Vector4D& v)
{
	x = v.x;
	y = v.y;
	z = v.z;
	w = v.w;
}

Vector4D::Vector4D(double x_, double y_, double z_, double w_){
	x = x_;
	y = y_;
	z = z_;
	w = w_;
}

//Construit le vecteur de p1 vers p2
Vector4D::Vector4D(Vector4D p1, Vector4D p2){
	*this = p2 - p1;
}

Vector4D::~Vector4D(void)
{
}

Vector4D& Vector4D::operator+=(const Vector4D &v)
{
	x += v.x;
	y += v.y;
	z += v.z;
	w += v.w;

	return *this;
}

Vector4D& Vector4D::operator-=(const Vector4D &v)
{
	x -= v.x;
	y -= v.y;
	z -= v.z;
	w -= v.w;

	return *this;
}

//Norme euclidienne
double Vector4D::norm(){
	return sqrt(x*x + y*y + z*z);
}

//Normalise
Vector4D Vector4D::normalize(){
	double norm = this->norm();

	if(norm == 0.0) return Vector4D(x, y, z, w);

	return Vector4D(x/norm, y/norm, z/norm, w);
}

//Produit scalaire
double Vector4D::dotProduct(Vector4D v1, Vector4D v2){
	return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
}

double Vector4D::dotProduct(Vector4D v1, double scalaire){
	return v1.x*scalaire + v1.y*scalaire + v1.z*scalaire;
}

double Vector4D::dotProduct(double scalaire, Vector4D v1){
	return dotProduct(v1, scalaire);
}

//Produit vectoriel
Vector4D Vector4D::crossProduct(Vector4D v1, Vector4D v2){
	return Vector4D(v1.y*v2.z + v1.z*v2.y,
					v1.x*v2.z + v1.z*v2.x,
					v1.x*v2.y + v1.y*v2.x,
					0);
}

Vector4D operator-(Vector4D const& v1, Vector4D const& v2)
{
	Vector4D copie(v1);
    copie -= v2;
    return copie;
}

Vector4D operator+(Vector4D const& v1, Vector4D const& v2)
{
	Vector4D copie(v1);
    copie += v2;
    return copie;
}